package com.briup.corejava.day14;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * 异常的抛出和捕获
 */
public class Test2 {
    public static void main(String[] args){
        // 作为具备异常的方法的调用者，可以选择将异常处理
        // 也可以选择将异常抛给jvm，main方法是栈中的最后一个方法了
        System.out.println("start...");
        try{
            new Test2().test("tom");
        }catch (Exception e){
            // 打印异常栈信息
            // e.printStackTrace();
            // 获得异常信息并输出
            System.out.println(e.getMessage());
        }
        System.out.println("end...");

        // 捕获多种异常
        // 代码不需要理解，跟着敲
        Class<?> aClass = null;
        try {
            aClass = Class.forName("com.briup.corejava.day14.Test1");
            Method main = aClass.getMethod("main", String[].class);
            main.invoke(null);
        } catch (ClassNotFoundException e) {
            System.out.println("类型找不到");
        } catch (InvocationTargetException e) {
            System.out.println("方法执行错误");
        } catch (NoSuchMethodException e) {
            System.out.println("方法找不到");
        } catch (IllegalAccessException e) {
            System.out.println("非法访问");
        }catch (Exception e){
            System.out.println("除了上面的异常，再有异常在这里");
        }
    }
    public void test(String name) throws Exception{
        if(!"tom".equals(name)){
            // 手动抛出异常
            // 这里抛出的是运行时异常，不会被检查
            throw new RuntimeException("名字和预期不符");
        }
        if("tom".equals(name)){
            // 手动抛出异常
            // 这里抛出的是编译型异常，不会被检查
            throw new Exception("名字和预期相符");
        }

        divide(10,0);
    }
    public void divide(int x, int y){
        // 自动抛出的异常
        System.out.println(x/y);
    }
}
